package main

import "fmt"

var _ = ` 
		1. 数组：是同一种数据类型的固定长度的序列。
    	2. 数组定义：var a [len]int，比如：var a [5]int，数组长度必须是常量，且是类型的组成部分。一旦定义，长度不能变。
    	3. 长度是数组类型的一部分，因此，var a[5] int和var a[10]int是不同的类型。
    	4. 数组可以通过下标进行访问，下标是从0开始，最后一个元素下标是：len-1
    	for i := 0; i < len(a); i++ {}
    	for index, v := range a {}
    	5. 访问越界，如果下标在数组合法范围之外，则触发访问越界，会panic
    	6. 数组是值类型，赋值和传参会复制整个数组，而不是指针。因此改变副本的值，不会改变本身的值。
    	7.支持 "=="、"!=" 操作符，因为内存总是被初始化过的。
    	8.指针数组 [n]*T，数组指针 *[n]T。
	`

// 全局变量中定义数组
var arr0 [5]int = [5]int{1, 2, 3} // 长度为5的数组，不足5位自动补充数据类型的默认值
var arr1 = [5]int{1, 2, 3, 4, 5}
var arr2 = [...]int{1, 2, 3}              // ...没有长度限制
var str3 = [5]string{3: "hello", 4: "go"} // 根据索引设置值

// 全局中定义多维数组
var Arr1s [3][3]int
var Arr2s [2][3]int = [...][3]int{{1, 2, 5}, {3, 4, 9}}

func main() {
	fmt.Println(arr0)
	fmt.Println(arr1)
	fmt.Println(arr2)
	fmt.Println(str3)
	fmt.Println(str3[0])
	fmt.Println(str3[3])

	ArrayList()
	// 局部定义多维数组
	a := [...][2]int{{1, 2}, {3, 4}} /*多维数组中，列不能用...表示*/
	fmt.Println(a)
	fmt.Println("2->:", a[0][1])

	// 多维数组遍历
	for k1, v1 := range Arr2s {
		fmt.Println("---- v1：", v1)
		for k2, v2 := range v1 {
			fmt.Printf("\n(%d,%d)=%d \n", k1, k2, v2)
		}
	}

}

func ArrayList() {
	a := [3]int{1, 2}      // 未初始化的值用数据类型的默认值
	b := [...]int{1, 2, 3} // 自动获取元素个数确定数组长度
	c := [5]string{2: "Tom"}
	d := [...]struct {
		name string
		age  int
	}{
		{"jak", 19},
		{"Ank", 18},
	}
	fmt.Println(a, b, c, d)
}
